package com.examsys.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;

import com.examsys.po.Admin;
import com.examsys.po.AdminRoles;
import com.examsys.service.AdminRolesService;
import com.examsys.service.AdminService;
import com.examsys.util.JsonUtils;
/**
 * 管理员控制层
 * @author Administrator
 *
 */
@WebServlet("/admin")
public class AdminController extends BaseController{
	//log4j日志对象
	private Logger log = Logger.getLogger(this.getClass());
	
	private AdminService adminService;//业务逻辑层对象
	
	private AdminRolesService adminRolesService;//业务逻辑层对象
	
	/**
	 * 初始化工作，这里主要是给业务逻辑层属性做初始化
	 */
	@Override
	public void init() throws ServletException {
		super.init();
		adminService=lookUp("adminService");
		adminRolesService=lookUp("adminRolesService");
	}
	
	/**
	 * 初始化角色数据
	 * @return
	 * @throws IOException 
	 */
	public void rolesDatas(HttpServletRequest request, HttpServletResponse response) throws IOException{
		log.info("获取角色下拉框数据");
		List<AdminRoles> adminRolesList=null;
		try {
			adminRolesList = adminRolesService.getList();
		
		} catch (Exception e) {
			log.error("获取系统功能父级下拉框数据失败",e);
		}
		//最终给JsonUtils转换为json数据输出给浏览器
		response.getWriter().write(JsonUtils.objectToJson(adminRolesList));		
	}
	
	/**
	 * 保存添加
	 * @param admin
	 * @return
	 * @throws IOException 
	 */
	@RequestMapping("/addSave")
	public void addSave(HttpServletRequest request, HttpServletResponse response) throws IOException{
		Integer role_id=Integer.valueOf(request.getParameter("role_id"));
		Admin admin=new Admin();
		log.info("接收到页面添加的数据："+admin+",角色编号："+role_id);//把admin放到日志
		Map jsonDatas=new HashMap();//存放json数据的集合
		jsonDatas.put("status", 0);//默认状态为0，表示操作失败
		try {
			AdminRoles adminRoles = adminRolesService.get(role_id);
			admin.setAdminRoles(adminRoles);
			//通过用户名去获取管理员
			boolean flag = adminService.add(admin);
			
			if(flag){
				jsonDatas.put("status", 1);//设置状态为1，表示操作成功
			}
		
		} catch (Exception e) {
			log.error("添加失败", e);
		}
		//最终给JsonUtils转换为json数据输出给浏览器
		response.getWriter().write(JsonUtils.objectToJson(jsonDatas));
	}
	
	/**
	 * 初始化修改
	 * @param id
	 * @return
	 * @throws IOException 
	 */
	public void update(HttpServletRequest request, HttpServletResponse response) throws IOException{
		Integer id=Integer.valueOf(request.getParameter("id"));
		log.info("开始初始化编号为"+id+"的管理员数据供前端修改");//把id放到日志
		Admin admin = null;
		try {
			//通过id去获取管理员
			admin = adminService.get(id);
			
		} catch (Exception e) {
			log.error("初始化修改失败", e);
		}
		//最终给JsonUtils转换为json数据输出给浏览器
		response.getWriter().write(JsonUtils.objectToJson(admin));		
	}
	
	/**
	 * 保存修改
	 * @param admin
	 * @return
	 * @throws IOException 
	 */
	public void updateSave(HttpServletRequest request, HttpServletResponse response) throws IOException{
		Integer roles_id=Integer.valueOf(request.getParameter("role_id"));
		Admin admin=new Admin();
		log.info("接收到页面修改的数据："+admin+",角色编号："+roles_id);//把admin放到日志
		Map jsonDatas=new HashMap();//存放json数据的集合
		jsonDatas.put("status", 0);//默认状态为0，表示操作失败
		
		try {
			//通过编号获取管理员
			Admin oldAdmin = adminService.get(admin.getId());
			
			//填上修改过的数据
			oldAdmin.setUser_name(admin.getUser_name());
			oldAdmin.setUser_pass(admin.getUser_pass());
			oldAdmin.setPhone(admin.getPhone());
			oldAdmin.setStatus(admin.getStatus());
			oldAdmin.setRemark(admin.getRemark());
			
			if(roles_id!=null){
				AdminRoles adminRoles = adminRolesService.get(roles_id);
				oldAdmin.setAdminRoles(adminRoles);
			}else{
				oldAdmin.setAdminRoles(null);
			}
			
			//调用业务逻辑层保存修改的管理员
			boolean flag = adminService.update(oldAdmin);
			
			if(flag){
				jsonDatas.put("status", 1);//设置状态为1，表示操作成功
			}
		
		} catch (Exception e) {
			log.error("修改失败", e);
		}
		//最终给JsonUtils转换为json数据输出给浏览器
		response.getWriter().write(JsonUtils.objectToJson(jsonDatas));		
	}
	
	/**
	 * 删除管理员
	 * @param id
	 * @return
	 * @throws IOException 
	 */
	public void delete(HttpServletRequest request, HttpServletResponse response) throws IOException{
		Integer id=Integer.valueOf(request.getParameter("id"));
		log.info("开始删除编号为"+id+"的管理员");//把id放到日志
		Map jsonDatas=new HashMap();//存放json数据的集合
		jsonDatas.put("status", 0);//默认状态为0，表示操作失败
		
		try {
			//通过编号删除管理员
			boolean flag = adminService.delete(id);
			
			if(flag){
				jsonDatas.put("status", 1);//设置状态为1，表示操作成功
			}
			
		} catch (Exception e) {
			log.error("删除失败", e);
		}
		//最终给JsonUtils转换为json数据输出给浏览器
		response.getWriter().write(JsonUtils.objectToJson(jsonDatas));		
	}
	
	/**
	 * 管理员管理
	 * @return
	 * @throws IOException 
	 * @throws ServletException 
	 */
	public void select(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		log.info("进入管理员管理页面");
		request.getRequestDispatcher("admin/AdminManager.jsp").forward(request, response);//设置显示页面
	}
	
	/**
	 * 管理员管理表格数据
	 * @param admin 查询条件
	 * @param page 页码
	 * @param rows 每一页行数
	 * @return
	 * @throws IOException 
	 */
	public void selectDatas(HttpServletRequest request, HttpServletResponse response) throws IOException{
		Admin admin=new Admin();
		log.info("开始获取管理员管理表格数据");
		Map jsonDatas=new HashMap();//待返回json集合数据;
		List<Admin> adminList=new ArrayList<Admin>();//待返回系统功能数据;
		try {
			//分页处理
			adminList = adminService.getList(admin);
			//取记录总条数
			jsonDatas.put("total", adminList.size());//总数
			jsonDatas.put("rows", adminList);//前端需要的行数据
		} catch (Exception e) {
			log.error("获取管理员管理表格数据失败",e);
		}
		//最终给JsonUtils转换为json数据输出给浏览器
		response.getWriter().write(JsonUtils.objectToJson(jsonDatas));		
		
	}
}
